Mybatis实现存取Mysql的Json字段映射Java对象 | 您所在的位置:网站首页 › mybatis 保存对象 › Mybatis实现存取Mysql的Json字段映射Java对象 |
Mybatis实现存取Mysql的Json字段映射Java对象
一、需求二、解决方案
一、需求
在业务比较复杂的项目模块,为了应对多样化的场景,我们通常会在mysql中采用json格式来存储相应的信息。使用json格式存储数据有它的优缺点,在这里我们就不细说了,有兴趣的朋友可以去查一下。 在进行开发的过程中,我们是希望在mysql中查询出的json格式数据直接映射成java对象;而java对象也可以转换成json格式数据进行存储;在这里记录一下我们如何实现这样的需求。 二、解决方案定义一个JsonTypeHandler类,继承于org.apache.ibatis.type.BaseTypeHandler,代码如下: public class JsonTypeHandler extends BaseTypeHandler { private static final ObjectMapper mapper = new ObjectMapper(); private Class clazz; public JsonTypeHandler(Class clazz) { if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null"); this.clazz = clazz; } @Override public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, this.toJson(parameter)); } @Override public T getNullableResult(ResultSet rs, String columnName) throws SQLException { return this.toObject(rs.getString(columnName), clazz); } @Override public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return this.toObject(rs.getString(columnIndex), clazz); } @Override public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return this.toObject(cs.getString(columnIndex), clazz); } private String toJson(T object) { try { return mapper.writeValueAsString(object); } catch (Exception e) { throw new RuntimeException(e); } } private T toObject(String content, Class clazz) { if (content != null && !content.isEmpty()) { try { return (T) mapper.readValue(content, clazz); } catch (Exception e) { throw new RuntimeException(e); } } else { return null; } } static { mapper.configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false); mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); } }用法: 入库:#{jsonDataField, typeHandler=com.tiptimes.oa.system.util.JsonTypeHandler} 出库:通过以上的配置就可以实现我们想要的功能,亲测有效。 |
CopyRight 2018-2019 实验室设备网 版权所有 |